﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Iudicium.Persona.CRN
{

    /// <summary>
    /// Descripción breve de PersonaJuridicaCRN
    /// </summary>
    public class PersonaJuridicaCRN
    {
        public PersonaJuridicaCRN()
        {
            
        }

        public static int InsertPersonaJuridica(PersonaJuridica objPersonaJuridica)
        {
            if (objPersonaJuridica == null)
            {
                throw new ArgumentException("objPersonaJuridica no puede ser nulo.");
            }

            if (string.IsNullOrEmpty(objPersonaJuridica.RazonSocial))
            {
                throw new ArgumentException("RazonSocial no puede ser nula o vacia.");
            }

            if (string.IsNullOrEmpty(objPersonaJuridica.Nit))
            {
                throw new ArgumentException("NIT no puede ser nulo o vacio.");
            }

            PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter adapter =
                new PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter();

            int? personaId = 0;

            adapter.Insert(ref personaId, objPersonaJuridica.RazonSocial, objPersonaJuridica.Nit);

            if (personaId == null || personaId.Value <= 0)
            {
                throw new Exception("El SQL se ejecuto con exito pero no se genero la llave correctamente");
            }

            return personaId.Value;
        }

        public static void UpdatePersonaJuridica(PersonaJuridica objPersonaJuridica)
        {
            if (objPersonaJuridica == null)
            {
                throw new ArgumentException("objPersonaJuridica no puede ser nulo.");
            }

            if (objPersonaJuridica.PersonaId <= 0)
            {
                throw new ArgumentException("PersonaId no puede ser menor o igual que cero.");
            }

            if (string.IsNullOrEmpty(objPersonaJuridica.RazonSocial))
            {
                throw new ArgumentException("RazonSocial no puede ser nula o vacia.");
            }

            if (string.IsNullOrEmpty(objPersonaJuridica.Nit))
            {
                throw new ArgumentException("NIT no puede ser nulo o vacio.");
            }

            PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter adapter =
                new PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter();

            adapter.Update(objPersonaJuridica.PersonaId, objPersonaJuridica.RazonSocial, objPersonaJuridica.Nit);
        }

        public static void DeletePersonaJuridica(int personaId)
        {
            if (personaId <= 0)
            {
                throw new ArgumentException("PersonaId no puede ser menor o igual que cero.");
            }

            PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter adapter =
                new PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter();

            adapter.Delete(personaId);
        }

        public static PersonaJuridica GetPersonaJuridicaByPersonaId(int personaId)
        {
            if (personaId <= 0)
            {
                throw new ArgumentException("PersonaId no puede ser menor o igual que cero.");
            }

            PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter adapter =
                new PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter();

            PersonaJuridicaDS.PersonaJuridicaDataTable tabla = adapter.GetPersonaJuridicaById(personaId);

            if (tabla == null || tabla.Count <= 0 || tabla[0].personaJuridicaId <= 0)
            {
                throw new Exception("El SQL se ejecuto correctamente pero no se retornaron resultados esperados.");
            }

            PersonaJuridica objPersonaJuridica = ConstruirPersonaJuridica(tabla[0]);
            return objPersonaJuridica;
        }

        public static List<PersonaJuridica> GetPersonaJuridicaBySearch(string param)
        {
            PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter adapter =
                new PersonaJuridicaDSTableAdapters.PersonaJuridicaTableAdapter();

            PersonaJuridicaDS.PersonaJuridicaDataTable tabla = adapter.GetPersonaJuridicaBySearch(param);

            if (tabla == null)
            {
                throw new Exception("El SQL se ejecuto correctamente pero no se retornaron resultados esperados.");
            }

            List<PersonaJuridica> lista = new List<PersonaJuridica>();
            foreach(PersonaJuridicaDS.PersonaJuridicaRow row in tabla)
            {
                PersonaJuridica objPersonaJuridica = ConstruirPersonaJuridica(row);
                lista.Add(objPersonaJuridica);
            }

            return lista;
        }

        private static PersonaJuridica ConstruirPersonaJuridica(PersonaJuridicaDS.PersonaJuridicaRow row)
        {
            return new PersonaJuridica(row.personaJuridicaId, row.razonSocial, row.nit);
        }
    }
}